package com.prueba.client;

import java.util.ArrayList;


//import com.prueba.server.persistence.PersonaDAO;
import com.prueba.shared.entity.Persona;
import com.prueba.shared.entity.Producto;
import com.prueba.shared.FieldVerifier;
//import com.thoughtworks.xstream.XStream;
//import com.thoughtworks.xstream.io.xml.DomDriver;
import com.google.gwt.core.client.EntryPoint;
import com.google.gwt.core.client.GWT;
import com.google.gwt.event.dom.client.ChangeEvent;
import com.google.gwt.event.dom.client.ChangeHandler;
import com.google.gwt.event.dom.client.ClickEvent;
import com.google.gwt.event.dom.client.ClickHandler;
import com.google.gwt.event.dom.client.KeyCodes;
import com.google.gwt.event.dom.client.KeyUpEvent;
import com.google.gwt.event.dom.client.KeyUpHandler;
import com.google.gwt.user.client.Timer;
import com.google.gwt.user.client.Window;
import com.google.gwt.user.client.rpc.AsyncCallback;
import com.google.gwt.user.client.ui.Button;
import com.google.gwt.user.client.ui.DialogBox;
import com.google.gwt.user.client.ui.FlexTable;
import com.google.gwt.user.client.ui.Grid;
import com.google.gwt.user.client.ui.HTML;
import com.google.gwt.user.client.ui.Label;
import com.google.gwt.user.client.ui.ListBox;
import com.google.gwt.user.client.ui.RadioButton;
import com.google.gwt.user.client.ui.RootPanel;
import com.google.gwt.user.client.ui.TextBox;
import com.google.gwt.user.client.ui.VerticalPanel;

/**
 * Entry point classes define <code>onModuleLoad()</code>.
 */
public class PruebaGWT implements EntryPoint {

	private VerticalPanel principal = new VerticalPanel();
	private Label lblNombres = new Label("*Nombres: ");
	private TextBox txtNombres = new TextBox();
	private Label lblApellidos = new Label("Apellidos: ");
	private TextBox txtApellidos = new TextBox();
	private Label lblEmail = new Label("*Email: ");
	private TextBox txtEmail = new TextBox();
	private Label lblFechaNacimiento = new Label("Fecha Nacimiento: ");
	private TextBox txtFechaNacimiento = new TextBox();

	// Labels y entradas de los productos
	private Label lblProductoNombre = new Label("*Nombre: ");
	private TextBox txtProductoNombre = new TextBox();
	private Label lblProductoDescripcion = new Label("Descripcion: ");
	private TextBox txtProductoDescripcion = new TextBox();
	private Label lblProductoValor = new Label("*Valor: ");
	private TextBox txtProdcutoValor = new TextBox();

	private Button btnAgregar = new Button("Agregar Persona");
	private Button btnAgregarProducto = new Button("Agregar Producto");
	private Label lblTiempo = new Label();

	// Grilla para agregar componentes

	private Grid gridPrincipal = new Grid(7, 2);
	private Grid gridProducto = new Grid(2, 3);

	// Tabla para mostrar los productos que se han agregado
	private FlexTable tablaProductos = new FlexTable();

	// Objeto Persona
	private Persona persona = new Persona();
	
	//Objeto Producto
	private Producto producto = new Producto();
	
	//Objeto PersonaDAO
//	private PersonaDAO pdb = new PersonaDAO();

	/**
	 * The message displayed to the user when the server cannot be reached or
	 * returns an error.
	 */
	private static final String SERVER_ERROR = "An error occurred while "
			+ "attempting to contact the server. Please check your network "
			+ "connection and try again.";

	/**
	 * Create a remote service proxy to talk to the server-side Greeting
	 * service.
	 */
	private final GreetingServiceAsync greetingService = GWT
			.create(GreetingService.class);

	/**
	 * This is the entry point method.
	 */
	public void onModuleLoad() {

		// Fila de los Nombres
		this.gridPrincipal.setWidget(0, 0, this.lblNombres);
		this.gridPrincipal.setWidget(0, 1, this.txtNombres);
		// Fila de los Apellidos
		this.gridPrincipal.setWidget(1, 0, this.lblApellidos);
		this.gridPrincipal.setWidget(1, 1, this.txtApellidos);
		// Fila del Email
		this.gridPrincipal.setWidget(2, 0, this.lblEmail);
		this.gridPrincipal.setWidget(2, 1, this.txtEmail);
		// Fila de Fecha de Nacimiento
		this.gridPrincipal.setWidget(3, 0, this.lblFechaNacimiento);
		this.gridPrincipal.setWidget(3, 1, this.txtFechaNacimiento);

		this.gridPrincipal.setWidget(4, 0, this.btnAgregarProducto);

		// Columna de nombre de producto
		gridProducto.setWidget(0, 0, this.lblProductoNombre);
		gridProducto.setWidget(1, 0, this.txtProductoNombre);

		// Columna de descripcion de producto
		gridProducto.setWidget(0, 1, this.lblProductoDescripcion);
		gridProducto.setWidget(1, 1, this.txtProductoDescripcion);

		// Columna de valor de producto
		gridProducto.setWidget(0, 2, this.lblProductoValor);
		gridProducto.setWidget(1, 2, this.txtProdcutoValor);

		this.gridPrincipal.setWidget(4, 1, gridProducto);

		this.gridPrincipal.setWidget(5, 0, this.btnAgregar);
		this.gridPrincipal.setWidget(5, 1, this.lblTiempo);
		this.lblTiempo.setText(new java.util.Date().toString());

		// Agregando el Grid
		this.principal.add(gridPrincipal);

		// Creando la tabla
		// Estableciendo el nombre a las columnas
		this.tablaProductos.setText(0, 0, "Nombre");
		this.tablaProductos.setText(0, 1, "Descripcion");
		this.tablaProductos.setText(0, 2, "Valor");
		this.tablaProductos.addStyleName("estiloTabla");

		// Agregando los estilos a las columnas
		this.tablaProductos.getRowFormatter().addStyleName(0, "cabezeraTabla");
		this.tablaProductos.getCellFormatter().addStyleName(0, 2,
				"columnaNumerica");

		// Agregando la tabla de productos
		this.principal.add(this.tablaProductos);

		// Asociando el codigo al Html
		RootPanel.get("principal").add(principal);

		// Evento click del boton Agregar Persona
		this.btnAgregar.addClickHandler(new ClickHandler() {
			@Override
			public void onClick(ClickEvent event) {
				agregarPersona();
			}
		});

		// Evento click del boton Agregar Producto
		this.btnAgregarProducto.addClickHandler(new ClickHandler() {
			@Override
			public void onClick(ClickEvent event) {
				agregarProducto();
			}
		});

		// Actualizar hora
		// Creando un timer para simular cambios
		Timer timer = new Timer() {
			@Override
			public void run() {

				lblTiempo.setText(new java.util.Date().toString());
			}
		};
		// Cada 1000 ms se llamara al metodo run del Timer
		timer.scheduleRepeating(1000);
	}

	// Limpia los datos del formulario
	private void limpiar() {
		this.txtNombres.setText("");
		this.txtApellidos.setText("");
		this.txtEmail.setText("");
		this.txtFechaNacimiento.setText("");
		this.txtProductoNombre.setText("");
		this.txtProductoDescripcion.setText("");
		this.txtProdcutoValor.setText("");

	}

	// Limpia los datos del formulario de producto
	private void limpiarProducto() {
		this.txtProductoNombre.setText("");
		this.txtProductoDescripcion.setText("");
		this.txtProdcutoValor.setText("");

	}

	// Limpia los datos de la tabla de productos
	private void limpiarTabla() {
		 
		// 1. Obtener nº de filas
		 int filas = this.tablaProductos.getRowCount();
		
		 // Se limpia cada fila de la tabla
		 for (int i = 1; i<filas; i++){
			 this.tablaProductos.setText(i, 0, "");
			  this.tablaProductos.setText(i, 1, "");
			  this.tablaProductos.setText(i, 2, ""); 
		 }
	}	
	
	//Agregar un producto
	
	private void agregarProducto() {
		
		
		
	 String nombre = this.txtProductoNombre.getText().toUpperCase();
	 String descripcion = this.txtProductoDescripcion.getText().toUpperCase();
	 String valor = this.txtProdcutoValor.getText().toUpperCase();
	 
	// Que los campos nombre y valor no sean vacios
		 if (nombre.equals("") || valor.equals("")) {
			 
		  Window.alert("Los campos con * son obligatorios");
		  
		  return;
		 }
	 
	 //Por ahora se crea una clase producto y se envia a una clase Persona
//	 final Producto producto = new Producto(nombre, descripcion, Integer.parseInt(valor));
	 
	 
	 // 1. Obtener nº de filas
	 int filas = this.tablaProductos.getRowCount();
	 // 2. Agrego a mi array el elemento
	 
//	 this.persona.getListaProductos().add(producto);
	 
	  // 3. Agrego a mi tabla
	  this.tablaProductos.setText(filas, 0, nombre);
	  this.tablaProductos.setText(filas, 1, descripcion);
	  this.tablaProductos.setText(filas, 2, valor);
	  
	  // 4. Formatos, se agregar formatos css

	  this.tablaProductos.getCellFormatter().addStyleName(filas, 
	        2,"columnaNumerica");
	 
	  // Agregar producto al objeto persona
	  
	  this.producto.setNombre(nombre);
	  this.producto.setDescripcion(descripcion);
	  this.producto.setValor(Integer.parseInt(valor));
	  
	  this.persona.getListaProductos().add(this.producto);
	  
	 this.limpiarProducto();
	}
	
	private void agregarPersona(){
		 String nombres = this.txtNombres.getText().toUpperCase();
		 String apellidos = this.txtApellidos.getText().toUpperCase();
		 String email = this.txtEmail.getText().toUpperCase();
		 String fechaNacimiento = this.txtFechaNacimiento.getText().toUpperCase();
		
		 
		// Que los campos nombre y valor no sean vacios
		 if (nombres.equals("") || email.equals("")) {
			 
		  Window.alert("Los campos con * son obligatorios");
		  
		  return;
		 }
		 
		 

//		 Persona personaObjeto = new Persona();
		 
		 this.persona.setNombres(nombres);
		 this.persona.setApellidos(apellidos);
		 this.persona.setEmail(email);
		 this.persona.setFechaNacimiento(fechaNacimiento);
		 
//		 XStream xstream = new XStream();
//		 xstream = new XStream(new DomDriver());
		 
//		 xstream.alias("Persona", Persona.class);
		 
//		 String xml = xstream.toXML(personaObjeto);
		 
//		 System.out.println(xml);
		 
			greetingService.greetServer(this.persona.toString(),
					new AsyncCallback<String>() {
						public void onFailure(Throwable caught) {
							// Show the RPC error message to the user
						
						}

						public void onSuccess(String result) {
							
						}
					});
		 
		 this.limpiar();
		 this.limpiarProducto();	
		 this.limpiarTabla();
	}
	
}


